package conf

import "time"

type Bootstrap struct {
	App     *App     `json:"app"`
	Server  *Server  `json:"server"`
	Data    *Data    `json:"data"`
	Service *Service `json:"service"`
}

type App struct {
	Name             string  `json:"name"`
	Version          string  `json:"version"`
	GinMode          string  `json:"gin_mode"`
	Logger           *Logger `json:"logger"`
	SessionExpireSec int64   `json:"session_expire_sec"`
}

type Fluentd struct {
	Addr string `json:"addr"`
}

type Kafka struct {
	Addr      string `json:"addr"`
	Topic     string `json:"topic"`
	Partition int    `json:"partition"`
}

type Logger struct {
	Level   string   `json:"level"`
	Fluentd *Fluentd `json:"fluentd"`
	Kafka   *Kafka   `json:"kafka"`
}

type Http struct {
	Addr           string `json:"addr"`
	Timeout        string `json:"timeout"`
	JwtSecret      string `json:"jwt_secret"`
	TokenExpireSec int64  `json:"token_expire_sec"`
}

type Grpc struct {
	Addr           string `json:"addr"`
	Timeout        string `json:"timeout"`
	JwtSecret      string `json:"jwt_secret"`
	TokenExpireSec int64  `json:"token_expire_sec"`
}

type Server struct {
	Http *Http `json:"http"`
	Grpc *Grpc `json:"grpc"`
}

type Data struct {
	Mysql *Mysql `json:"mysql"`
	Redis *Redis `json:"redis"`
	Mongo *Mongo `json:"mongo"`
}

type Mysql struct {
	Dsn             string        `json:"dsn"`
	MaxIdleConns    int           `json:"max_idle_conns"`
	MaxOpenConns    int           `json:"max_open_conns"`
	ConnMaxLifeTime time.Duration `json:"conn_max_life_time"`
	AutoMigrate     bool          `json:"auto_migrate"`
}

type Redis struct {
	Address   string `json:"address"`
	Database  int    `json:"database"`
	Password  string `json:"password"`
	Timeout   int    `json:"timeout"`
	MaxIdle   int    `json:"max_idle"`
	MaxActive int    `json:"max_active"`
}

type Mongo struct {
	Dsn      string `json:"dsn"`
	Db       string `json:"db"`
	UserName string `json:"user_name"`
	Password string `json:"password"`
	MaxPool  uint64 `json:"max_pool"`
	MinPool  uint64 `json:"min_pool"`
}

type ChatHub struct {
	ShardLen    uint
	ClientChLen uint
}

type Service struct {
	ChatHub *ChatHub `json:"chat_hub"`
}
